#ifndef __LINK_LIST_H__
#define __LINK_LIST_H__

/**
 * 单项链表的学习
 */

// 
#include "Elemnt_data_list.h"

// =============   花名册   =============
// 数据关系
typedef struct Node
{
    Elenemt_data data;      // 数据域
    struct Node * next;     // 指针域(下一个)
    struct Node * prev;     // 指针域(上一个)
}Node;


typedef struct link_list
{
    struct Node * next;     // 指针域
}Link_list;

// =============   航班   =============

typedef struct Node_1
{
    Data_type data;      // 数据域
    struct Node_1 * next;     // 指针域(下一个)
    struct Node_1 * prev;     // 指针域(上一个)
}hang;

typedef struct link_hang
{
    hang * next;     // 指针域
}Link_hang;

// 双链表的创建
Link_list* init_link_list(void);

// 双链表的创建(航班)
Link_hang *init_link_hang(void);


// 单链表的销毁
void free_link_list(Link_list ** list);

// 双链表的销毁(航班)
void free_link_hang(Link_hang **list);

// 链表的遍历(名单)
void print_link_list(Link_list *L);

// 双链表的遍历(一个)
void print_link_list_1(Node *ptr);

// 双链表的遍历(航班)
void print_link_hang(Link_hang *L);

// 双链表的遍历(一个航班)
void print_link_hang_1(hang *ptr_1);

// 链表的打印到文件里(花名册)
void fprint_wen(Link_list *L);

// 链表的打印到文件里(航班)
void fprint_hang(Link_hang *L);

// 链表的打印到文件里(记录)
void fprint_jilu(Link_list *L);

// 双链表的插入(航班)
void insert_hang(Link_hang *list, Data_type data, int index);

// 单链表的插入
void insert_node(Link_list* list, Elenemt_data data, int index);

// 双链表的头插(没有数据)
void toucha(Link_list *list, Node *data);

// 双链表的头插(航班)
void toucha_hang(Link_hang *list, hang *data);

//尾插
void weicha(Link_list *list, Node *data);

// 尾插(航班)
void weicha_hang(Link_hang *list, hang *data);

// 单链的数目
int num(Link_list *list);

// 链表的数目(航班)
int num_hang(Link_hang *list);

// 任意位置删除
void renyishan(Link_list *list, int pos);

//尾删
void weishan(Link_list *list);

// 单链表的查找
Node* find_node_id(Link_list* list, int index);
Node* find_node_name(Link_list* list, char* name);

// 单链表的判空
int IsEmpty_Sql_List(Link_list* list);

// 单链表的清空
// void clear_link_list(Link_list* list);

// 单链表的合并
Link_list* merge_link_lists(Link_list* list1, Link_list* list2);

#endif
